package prefix_sum;

import java.util.HashMap;
import java.util.Map;

/**
 * 和可被 k 整除的子数组
 */

public class Demo20250417 {
    public int subarraysDivByK(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();
        hash.put(0 % k, 1);
        int sum = 0, ret = 0;
        for (int x : nums) {
            sum += x; // 前缀和
            int r = (sum % k + k) % k;
            ret += hash.getOrDefault(r, 0); // 统计结果
            hash.put(r, hash.getOrDefault(r, 0) + 1);
        }
        return ret;
    }

    public int subarraysDivByKReview(int[] nums, int k) {
        // 创建一个哈希表
        Map<Integer,  Integer> hash = new HashMap<>();
        hash.put(0 % k, 1);
        int sum = 0, ret = 0;
        for(int x : nums) {
            // 计算前缀和
            sum += x;
            // 计算哈希表中前缀和余数为 (sum % k + k) % k 的数量
            int r = (sum % k + k) % k;
            ret += hash.getOrDefault(r, 0);
            // 将当前的前缀和丢入到哈希表中
            hash.put(r, hash.getOrDefault(r, 0) + 1);
        }
        return ret;
    }
}
